//import java.awt.Color;
//import java.awt.FlowLayout;
//import java.awt.Paint;
//import java.awt.Point;
//import java.io.ByteArrayInputStream;
//import java.io.ByteArrayOutputStream;
//import java.io.File;
//import java.io.FileInputStream;
//import java.io.FileNotFoundException;
//import java.io.IOException;
//import java.io.ObjectInputStream;
//import java.io.ObjectOutputStream;
//import java.util.ArrayList;
//import java.util.Iterator;
//import java.util.Scanner;
//import java.util.Stack;
//
//import javax.swing.Box;
//import javax.swing.BoxLayout;
//import javax.swing.JFrame;
//import javax.swing.JPanel;
//import javax.swing.JTextArea;
//
//import org.apache.commons.collections15.Transformer;
//
//import edu.uci.ics.jung.algorithms.layout.ISOMLayout;
//import edu.uci.ics.jung.algorithms.layout.Layout;
//import edu.uci.ics.jung.graph.DirectedGraph;
//import edu.uci.ics.jung.graph.DirectedSparseMultigraph;
//import edu.uci.ics.jung.visualization.BasicVisualizationServer;
//import edu.uci.ics.jung.visualization.VisualizationViewer;
//import edu.uci.ics.jung.visualization.decorators.ToStringLabeller;
//import edu.uci.ics.jung.visualization.renderers.Renderer.VertexLabel.Position;
//
//// This is just for testing 	IGNORE
//public class MainTest {
//	static ArrayList<Node> nodes;
//	private static FewestLinks fwL;
//	
//
//	// This is just for testing 	IGNORE
//	private static Node findNode(String n, ArrayList<Node> nodes){
//		Iterator<Node> iterator = nodes.iterator();
//		Node nod = null ;
//		while (iterator.hasNext()){
//			nod = iterator.next();
//			if(nod.getID().equals(n)){
//				break;
//			}			
//		}
//		return nod;		
//	}
//	// This is just for testing 	IGNORE
//	
//	private static void updateNeighbors(String f, Node n, ArrayList<Node> nodes){
//		Iterator<Node> iterator = nodes.iterator();
//		Node nod;
//		while (iterator.hasNext()){						
//			nod = iterator.next();
//			if (nod.getID().equals(f)){
//				n.getNeighbors().add(nod);
//				break;
//			}
//			
//		}
//	}
//	// This is just for testing 	IGNORE
//
//	private static void updatePosition(int x, int y, Node n){
//		Point pos = new Point(x, y);
//		n.setPos(pos);
//	}
//	
//	// This is just for testing 	IGNORE
//	 public void copy(Object orig) {
//	        Object obj = null;
//	        try {
//	            // Write the object out to a byte array
//	            ByteArrayOutputStream bos = new ByteArrayOutputStream();
//	            ObjectOutputStream out = new ObjectOutputStream(bos);
//	            out.writeObject(orig);
//	            out.flush();
//	            out.close();
//
//	            // Make an input stream from the byte array and read
//	            // a copy of the object back in.
//	            ObjectInputStream in = new ObjectInputStream(
//	                new ByteArrayInputStream(bos.toByteArray()));
//	            obj = in.readObject();
//	        }
//	        catch(IOException e) {
//	            e.printStackTrace();
//	        }
//	        catch(ClassNotFoundException cnfe) {
//	            cnfe.printStackTrace();
//	        }
//	      
//	    }
//	 
//
//	public static void main(String[] args) {
//		
//		
//		
//		File fl1 = new File("/home/ysdelahoz/connsamp.txt");
//		File fl2 = new File("/home/ysdelahoz/locsamp.txt");
//		nodes = new ArrayList<Node>();
//
//		Scanner scanner = null;
//		try {
//			scanner = new Scanner(new FileInputStream(fl1));
//		} catch (FileNotFoundException e1) {
//			// TODO Auto-generated catch block
//			e1.printStackTrace();
//		}
//		
//		// This is just for testing 	IGNORE
//		String line;
//		try {
//			while (scanner.hasNextLine()) {
//				line = scanner.nextLine();
//				if (!line.equals("END")) {
//					int index1 = line.indexOf(" ");
//					String nodeID = line.substring(0, index1);
//					
//					int index2 = line.indexOf(" ", index1+1);
//					String ncount = line.substring(index1+1, index2);
//					
//					//Node Creation
//					Node node = new Node();
//					node.setID(nodeID);
//					node.setNeighCount(Integer.parseInt(ncount));
//					nodes.add(node);
////					System.out.println("The node added was "+node.getID());
//
//					// This is just for testing 	IGNORE
//
//				}
//
//			}
//		} finally {
//			scanner.close();
//		}
//		
//		// This is just for testing 	IGNORE
//
//		// Add neighbors to each node
//		try {
//			scanner = new Scanner(new FileInputStream(fl1));
//		} catch (FileNotFoundException e1) {
//			// TODO Auto-generated catch block
//			e1.printStackTrace();
//		}
//
//		try {
//			while (scanner.hasNextLine()) {
//				line = scanner.nextLine();
//				if (!line.equals("END")) {
//					int index1 = line.indexOf(" ");
//					String nodeID = line.substring(0, index1);
//					Node nodID = findNode(nodeID, nodes);
//					
//					int index2 = line.indexOf(" ", index1+1);
//					String n = line.substring(index2+1);
//					while (!n.equals("\n")){
//						
//						int ix1 = n.indexOf(" ");
//						if (ix1==-1){
//							String temp = n.substring(0);
//							updateNeighbors(temp, nodID, nodes);
//							break;
//						}
//						else{
//							String temp = n.substring(0,ix1);
//							updateNeighbors(temp, nodID, nodes);
//							n = n.substring(ix1+1);
//						}
//					}
//				}
//
//			}
//		} finally {
//			scanner.close();
//		}
//		
//		
//		// Add position to each node
//		try {
//			scanner = new Scanner(new FileInputStream(fl2));
//		} catch (FileNotFoundException e1) {
//			// TODO Auto-generated catch block
//			e1.printStackTrace();
//		}
//
//		try {
//			while (scanner.hasNextLine()) {
//				line = scanner.nextLine();
//				if (!line.equals("END")) {
//					int index1 = line.indexOf(" ");
//					String nodeID = line.substring(0, index1);
//					Node nodID = findNode(nodeID, nodes);
//					
//					String n = line.substring(index1+1);
//					int ix1 = n.indexOf(" ");
//					String x = n.substring(0,ix1);
//					x = x.replaceAll("\\s", "");
//					String y = n.substring(ix1+1);
//					y = y.replaceAll("\\s", "");
//					updatePosition(Integer.parseInt(x), Integer.parseInt(y), nodID);
//					}
//
//			}
//		} finally {
//			scanner.close();
//		}
//		
//		JFrame frame = new JFrame("Simple Graph View");
//		
//		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//		JPanel panel = (JPanel) frame.getContentPane();
//		panel.setSize(300, 400);
//		
//		
//		
//		
//		Graph graph = new Graph(nodes,panel);
//		final Node source = findNode("B1", nodes);
//        Transformer<Node,Paint> vertexColor = new Transformer<Node,Paint>() {
//         	@Override
//			public Paint transform(Node arg0) {
//				// TODO Auto-generated method stub
//				if(arg0==source){
//					return Color.GREEN;
//				}
//				return Color.RED;
//			}
//        };
//        VisualizationViewer viserver = graph.GenGraph();
//        viserver.getRenderContext().setVertexFillPaintTransformer(vertexColor);
////		System.out.println("The graph g = " + graph.Graph.toString());
//		
//		frame.setVisible(true);
//		frame.pack();
////		
////		Astar ast = new Astar();
//		
//		fwL = new Astar(new Object(), new JTextArea());		
////		Node exclude1 = findNode("A4", nodes);
////		Node exclude2 = findNode("C3", nodes);
////		exclude1.setVisited(true);
////		exclude2.setVisited(true);
////		Node source = findNode("A1", nodes);
//		Node target = findNode("C3", nodes);
//		
//		Path pathtotarget = null;
//		try {
//			pathtotarget = fwL.calculatePath(source, target, viserver, 1);
//		} catch (Exception e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}
//		Stack<Node> finalstack = pathtotarget.getStack();
//		for (int i=0;i<finalstack.size();i++){
//			System.out.println(pathtotarget.getStack().get(i).getID());
//			
//		}
//		Iterator<Node> iter = nodes.iterator();
//		while (iter.hasNext()){
//			Node node = iter.next();
//			node.setVisited(false);
//		}
//	}
//
//
//}
////This is just for testing 	IGNORE